/*
  dart 变量： dart 是一个强大的脚本语言，可以不预先定义变量类型，自动会类型判断
            在dart中定义变量可以通过var 关键字来申明变量

  dart 常量： final 与 const 
             const 值不变 一开始就得要赋值，
             final 开始可以不赋值，只能赋值一次
  dart 支持一下数据类型
      常用数据类型：
      Number(数值)
        int
        double
      String(字符串)
        String
      Boolean(布尔)
        bool
      List(数组)
        在dart中数组就是列表对象，所以大多数的人只称它为列表
      Maps(字典)
        通常来说 Map是一个键值对相关的对象，键和值可是任意类型的对象，每个键只出
         /*
    常量演示
    final Time = new DateTime.now();
    print(Time);
    String str = '32332';
    print(str);
   */

  /*
    字符串拼接
     String str1 = "1234";
      String str2 = '5678';
      print(str1 + str2);
      print('$str1$str2');
   */

  /*
    定义List的方法
    第一种通过字面量
      List l1 = ['23','3232','232'];
       print(l1[1]);
    第二种 通过new 关键字来定义
      List l2 = new List();
      l2.add('张三');
      l2.add('李四');
      l2.add('王五');
      print(l2[2]);
      定义指定类型
        List l3 = new List<String>();
  l3.add('323');
  print(l3[0]);
  
  // 赋值运算
    ??= 表示 如果此变量不为空就进行赋值
    int b;
    b??= 1;
    
    int a ;
    int b =  a ?? 20;
    print(b);
  print(b);


    // Number  String 转换

  String str = '12';
  print(int.parse(str) is int);

  int num = 32;
  String str1 = num.toString();
  print(str1 is String);
  String s2 = '32.3';
  double n = double.parse(s2);
  print(n);
   */

  // 判断字符串是否为空
  String s1 = '1221';
  print(s1.isEmpty);  


  ++ -- 
  在赋值运算中 写在后面与前面的区别
    写在后面表示先赋值 后运算自增加1
    卸载前面 表示先运算自增加1 然后在赋值
  如果不在赋值运算中使用 不管在前在后都是一样的
 */
import './Animal.dart';
void main() {
  /*
    List列表的属性以及方法
      属性：
            isEmpty:判断数组是否为空
            isNotEmpty:判断数组是否不为空
      方法：
          add():增加数组数据只能增加一个
          addAll(['32','32']): 相当于拼接数组
          indexOf():查找元素的索引值 如果没有元素 就会返回-1  有的话就正常返回元素的索引
          remove():传入元素删除元素但是只能删除找到第一个元素
          removeAt():传入索引值删除对应的索引元素
          filRange():修改数据
          insert(index,value): 表示指定的位置插入数据
          insertAll()： 指定位置插入数组
          toSet():进行数组去重

    Set类 用它最主要的就是去除数组重复内容
      set是没有顺序且不能重复的集合，所以不能通过索引去获取值

    映射（Maps）是无序的键值对
        常用属性：
          kyes:获取所有的key值
          values:获取所有的value 值
          isEmpty:是否为空
          isNotEmpty:是否不为空
        常用方法：
          remove(key) 删除指定的key 数据
          addAll({...}):合并映射内容添加属性
          containerValue():查看映射的值 返回bool 类型


    遍历的方法：
      forEach() :遍历数组每一项  但是没有返回值
      map():遍历加工数据后返回一个新的数组 等同于javaScript中的map 方法
      any():遍历数组数组中满足一个条件 就返回true   返回值bool 等同于javaScript中的some 方法
      where():遍历数组返满足条件的元素作为一个数组 等同于javaScript 中es6语法的fillter 方法
      every():遍历数组返bool 值 数组总所有元素满足条件才会返回true


    dart 与其他面向对象语言不一样Dart中没有public private protected 这些访问修饰符 
        但是可以使用_ 把一个属性或则方法定义成私有 但是必须要把这个类抽离成单独的一个文件 才会生效。
        私有属性可以通过共有的方法访问
        注意 ：通过get 修饰的方法 可以直接当着属性来使用 但是没有形参
        如果要通过方法改变属性 可以使用set 关键字来修饰，访问也是通过属性访问

    dart 中的对象操作符
      ? 条件运算符 （了解）
      as 类型转换
      is 类型判断
      .. 级联操作（连缀）
   */
//   Map o = {"name": "wjh", "age": 99};
//   o.addAll({"name":"cxj",});
//   print(o);
//   print(o.containsValue('cxj'));
//   List arr = ['32','232','12','32'];
//  o.forEach((key,value) {
//    print(key);
//    print(value);
//  });

  
  // print(getUserInfo('邬江红',sex:'女'));


  // List arr = [6,2,1,4,5,2];
  // dynamic newList = arr.map((item) => item > 2 ? item * 2 : item);

  // print(newList);
  // print(getEvenAll(n:100));
  // 递归求1-100的和
  // int getSun({int n,int sun=0}) {
  //     if(n <= 0) {
  //       return sun;
  //     };
  //     sun += n;

  //   return getSun(n: n -= 1,sun: sun);
  // }
  // print(getSun(n:100));


  String s1 = '34';
  (s1 as Animal).age;
  print(s1);

    
}

String getEven({int n}) {
    if(n % 2 == 0 ) {
      return "偶数";
    }
    return "奇数";
} 
List getEvenAll({int n}){
  List<int> arr = new List();
  while(n > 0) {
    n % 2 == 0 ? arr.add(n) : null;
    n--;
  }
  return arr;
}
String getUserInfo(String namem,{int age,String sex}) {
  if(age != null) {
    return "姓名：$namem,年龄$age ----- 性别$sex";
  }else {
    return "姓名：$namem,年龄未传入 ----- 性别$sex";

  }
}
